package com.fqy.gmall.item.service.impl;

import com.alibaba.fastjson.JSON;
import com.fqy.gmall.item.service.ItemService;
import com.fqy.gmall.model.product.*;
import com.fqy.gmall.product.client.ProductFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.stream.Collectors;

/**
 * User: fqy
 * Date: 2021/9/15
 * Time: 14:06
 * Describe: 1.service-item通过feign client调用其他微服务数据接口进行数据汇总
 *           2.CompletableFuture异步编排
 *             创建CompletableFuture对象：
 * 			            - runAsync方法不支持返回值。
 * 			            - supplyAsync可以支持返回值。
 * 			            - allOf：等待所有任务完成
 * 			            - anyOf：只要有一个任务完成
 * 如果主线程想等待子线程执行完成之后再结束，比如子线程处理一个数据，主线程要取得这个数据中的值，就要用到 join() 方法
 */
@Service
public class ItemServiceImpl implements ItemService {


    @Autowired
    private ProductFeignClient productFeignClient;

    @Autowired
    private ThreadPoolExecutor threadPoolExecutor;

    @Override
    public Map<String, Object> getItem(Long skuId) {

        Map<String, Object> map = new HashMap<>();
        // 商品详情:获取skuInfo 基本信息+ skuImage图片列表！
        CompletableFuture<SkuInfo> skuInfoCompletableFuture = CompletableFuture.supplyAsync(() -> {
            SkuInfo skuInfo = productFeignClient.getSkuInfo(skuId);
            map.put("skuInfo", skuInfo);
            return skuInfo;
        }, threadPoolExecutor);

        //  商品详情:获取商品价格数据
        CompletableFuture<Void> priceCompletableFuture = CompletableFuture.runAsync(() -> {
            BigDecimal skuPrice = productFeignClient.getSkuPrice(skuId);
            map.put("price", skuPrice);
        }, threadPoolExecutor);

        // 商品详情:根据三级分类Id 来获取分类名称等数据
        CompletableFuture<Void> categoryViewCompletableFuture = skuInfoCompletableFuture.thenAcceptAsync((skuInfo) -> {
            BaseCategoryView categoryView = productFeignClient.getCategoryView(skuInfo.getCategory3Id());
            map.put("categoryView", categoryView);
        }, threadPoolExecutor);

        // 商品详情:回显spu销售属性 并且显示默认选中的sku销售属性
        CompletableFuture<Void> spuSaleAttrListCompletableFuture = skuInfoCompletableFuture.thenAcceptAsync((skuInfo) -> {
            List<SpuSaleAttr> spuSaleAttrList = productFeignClient.getSpuSaleAttrListCheckBySku(skuId, skuInfo.getSpuId());
            map.put("spuSaleAttrList", spuSaleAttrList);
        }, threadPoolExecutor);

        // 商品详情:根据用户所选的销售属性组合 进行页面切换
        // {"3726|3727":"2","3725|3728":"4"}
        CompletableFuture<Void> valuesSkuJsonCompletableFuture = skuInfoCompletableFuture.thenAcceptAsync((skuInfo) -> {
            Map skuValueIdsMap = productFeignClient.getSkuValueIdsMap(skuInfo.getSpuId());
            String strJson = JSON.toJSONString(skuValueIdsMap);
            map.put("valuesSkuJson", strJson);
        }, threadPoolExecutor);

        // 根据spuId 来获取海报信息集合
        CompletableFuture<Void> spuPosterListCompletableFuture = skuInfoCompletableFuture.thenAcceptAsync((skuInfo) -> {
            List<SpuPoster> spuPosters = productFeignClient.getSpuPosterBySpuId(skuInfo.getSpuId());
            map.put("spuPosterList", spuPosters);
        }, threadPoolExecutor);
        // 根据skuId获取商品的规格与包装: 平台属性 平台属性值！
        CompletableFuture<Void> skuAttrListCompletableFuture = CompletableFuture.runAsync(() -> {
            List<BaseAttrInfo> attrList = productFeignClient.getAttrList(skuId);
            //!!!*注意细节*!!!
            List<Map<String, String>> skuAttrList = attrList.stream().map(baseAttrInfo -> {
                Map<String, String> attrMap = new HashMap<>();
                attrMap.put("attrName", baseAttrInfo.getAttrName());
                attrMap.put("attrValue", baseAttrInfo.getAttrValueList().get(0).getValueName());
                return attrMap;
            }).collect(Collectors.toList());
            //  规格：需要获取的是 attrName, attrValue
            map.put("skuAttrList", skuAttrList);
        }, threadPoolExecutor);
        //  需要将所有的异步编排线程进行组合！
        CompletableFuture.allOf(
                skuInfoCompletableFuture,
                priceCompletableFuture,
                categoryViewCompletableFuture,
                spuSaleAttrListCompletableFuture,
                valuesSkuJsonCompletableFuture,
                spuPosterListCompletableFuture,
                skuAttrListCompletableFuture
                ).join();
        //  返回数据
        return map;
    }
//    @Override
//    public Map<String, Object> getItem(Long skuId) {
//        Map<String, Object> map = new HashMap<>();
//        // 商品详情:获取skuInfo 基本信息+ skuImage图片列表！
//        SkuInfo skuInfo = productFeignClient.getSkuInfo(skuId);
//        //  商品详情:获取商品价格数据
//        BigDecimal skuPrice = productFeignClient.getSkuPrice(skuId);
//        // 商品详情:根据三级分类Id 来获取分类名称等数据
//        BaseCategoryView categoryView = productFeignClient.getCategoryView(skuInfo.getCategory3Id());
//        // 商品详情:回显spu销售属性 并且显示默认选中的sku销售属性
//        List<SpuSaleAttr> spuSaleAttrList = productFeignClient.getSpuSaleAttrListCheckBySku(skuId, skuInfo.getSpuId());
//        // 商品详情:根据用户所选的销售属性组合 进行页面切换
//        // {"3726|3727":"2","3725|3728":"4"}
//        Map skuValueIdsMap = productFeignClient.getSkuValueIdsMap(skuInfo.getSpuId());
//        String strJson = JSON.toJSONString(skuValueIdsMap);
//        // 根据spuId 来获取海报信息集合
//        List<SpuPoster> spuPosters = productFeignClient.getSpuPosterBySpuId(skuInfo.getSpuId());
//        // 根据skuId获取商品的规格与包装: 平台属性 平台属性值！
//        List<BaseAttrInfo> attrList = productFeignClient.getAttrList(skuId);
//        //!!!*注意细节*!!!
//        List<Map<String, String>> skuAttrList = attrList.stream().map(baseAttrInfo -> {
//            Map<String, String> attrMap = new HashMap<>();
//            attrMap.put("attrName", baseAttrInfo.getAttrName());
//            attrMap.put("attrValue", baseAttrInfo.getAttrValueList().get(0).getValueName());
//            return attrMap;
//        }).collect(Collectors.toList());
//        //  key =  页面获取数据时，需要绑定的key！
//        map.put("skuInfo",skuInfo);
//        map.put("price",skuPrice);
//        map.put("categoryView", categoryView);
//        map.put("spuSaleAttrList", spuSaleAttrList);
//        map.put("valuesSkuJson", strJson);
//        map.put("spuPosterList", spuPosters);
//        //  规格：需要获取的是 attrName, attrValue
//        map.put("skuAttrList", skuAttrList);
//        return map;
//    }
}
